package Java2XSB;

import com.declarativa.interprolog.*;

import Java2XSB.Area;
import Java2XSB.ListElem;

import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;


/**
 * La classe PianoGiornata contiene le informazioni su una visita relative ad una giornata.<br />
 * Contiene informazioni sulle aree da visitare e realtivi eventi presenti.
 * 
 * @author Antonio Sorgente
 * @version 1.0
 * @since ottobre 2012
 * @see EnvironmentXSB
 */
public class PianoGiornata {
	it.cnr.icib.XSBProlog.XSBProlog prolog;
  int giornata;
  ListElem listaAree;
  int NumAree;
  ListElem listaEventi;
 

  /**
	 * Dato in inputi un indice i di tipo int, ritorna la pianificazione della
	 * visita relativa all'i-esimo giorno.
	 * 
	 * @param pGiornata
	 */
  public PianoGiornata(it.cnr.icib.XSBProlog.XSBProlog prolog,int pGiornata) {
	  this.prolog=prolog;
	  listaAree=new ListElem(prolog);
	  listaEventi=new ListElem(prolog);
    giornata=pGiornata;
    loadPianoGiornta();
    loadEventi();
  }

  private void loadPianoGiornta() {

    /* Recupero da XSB le informasione sull'area e gli id dei siti appartenenti all'area*/

    TermModel PianificazioneGiorno=prolog.ValutareNonDeterministicGoal(" pianoGiornata("+giornata+",Y,Z,T)","Y+Z+T");

    TermModel H = PianificazioneGiorno.getChildren()[0]; // Head della query. Contiene i dati di una Area
    TermModel T=PianificazioneGiorno; //Tail
    /* Oggetti per la definizione di un'area*/
    TermModel siti = null;
    TermModel DatiArea = null;
    Object idA = null;

    int i=0;
    while(!T.isListEnd()){

      H=T.getChildren()[0];
      T=T.getChildren()[1];

      siti = H.getChildren()[1]; //la coda corrisponde alla lista dei siti

      H = H.getChildren()[0]; //elaboro la testa (id + definizione dell'area [x,y,dim])
      DatiArea = H.getChildren()[1]; //la coda corrisponde alle dimensioni dell'area

      idA = H.getChild(0); //l'Head corrisponde all'id dell'area
      int id=new Integer(idA.toString()).intValue();
      listaAree.addElem(new Area(prolog,id,DatiArea,siti,1),false);


      i++;
    }
    NumAree=i;
  }




  private void loadEventi() {
//    eventiGiorno(Giorno,ListaIdEventi).
      Object[][] ris=prolog.NonDeterministicGoal("  evento(X),eventiGiorno("+giornata+",_L), member(X,_L)","X","");

      for (int i=0; i<ris.length;i++){
        Object[][] eventi=prolog.NonDeterministicGoal("eventi("+ris[i][0]+",N,Di,Df,Cs)","N/Di/Df/Cs","/");

        if (eventi!=null){

          int lIdEvento=new Integer(ris[i][0].toString()).intValue();
          String lNome=eventi[0][0].toString();
          Date lDataInizio=convert2Date(eventi[0][1].toString().split(" ")[0]);
          Date lDataFine=convert2Date(eventi[0][2].toString().split(" ")[0]);
          int lIdSito=new Integer(eventi[0][3].toString()).intValue();

          listaEventi.addElem(new Evento(prolog,lIdEvento,lNome,lDataInizio,lDataFine,lIdSito),false);
        }
        else{
          /* Non ci sono eventi del giorno*/
          //System.out.println("Query Eventi non ok");
        }
      }
      //listaEventi.StampaTutto();
    }


    private Date convert2Date(String stringDate) {

        String stringFormat = "yyyy-MM-dd";
        DateFormat format = new SimpleDateFormat(stringFormat);
        java.util.Date date = null;
        java.sql.Date date2 = null;

        try {
          date =  format.parse(stringDate);
          date2=new Date(date.getTime());

        } catch (Exception e) { }

        return date2;
      }







  public int getGiornata(){
    return giornata;
  }

  public int getNumAree(){
    return listaAree.getNumElem();
  }


  public ListElem getListaAree(){
    return listaAree;
  }


  public Area getArea(int i){
    return (Area)listaAree.getElem(i);
  }

  public void setEventi(ListElem e){
    listaEventi=e;
  }

  public ListElem getEventi(){
      return listaEventi;
    }


}

